package com.stm.toolLedger.service.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.stm.basicData.domain.KfToolsBox;
import com.stm.basicData.domain.KfToolsType;
import com.stm.basicData.domain.ToolsFactory;
import com.stm.basicData.domain.ToolsModel;
import com.stm.basicData.mapper.KfToolsTypeMapper;
import com.stm.basicData.service.IToolsFactoryService;
import com.stm.basicData.service.IToolsModelService;
import com.stm.basicData.service.KfToolsBoxService;
import com.stm.basicData.service.KfToolsTypeService;
import com.stm.common.annotation.DataScope;
import com.stm.common.core.text.Convert;
import com.stm.common.exception.BusinessException;
import com.stm.common.utils.DateUtils;
import com.stm.common.utils.StringUtils;
import com.stm.system.domain.SysUser;
import com.stm.system.service.ISysDictDataService;
import com.stm.toolLedger.domain.KfTools;
import com.stm.toolLedger.mapper.KfToolsMapper;
import com.stm.toolLedger.service.KfToolsService;
import com.stm.toolsScrap.domain.KfRToolsScrap;
import com.stm.toolsScrap.domain.KfToolsScrapApply;
import com.stm.toolsScrap.mapper.KfRToolsScrapMapper;
import com.stm.toolsScrap.mapper.KfToolsScrapApplyMapper;

import lombok.extern.slf4j.Slf4j;

/**
 * 
 * @Description RFIdimpl
 * @CreateTime 2019年4月4日 上午8:43:59
 * @CreateBy 林龙
 */
@Service
@Slf4j
public class KfToolsServiceImpl implements KfToolsService
{
    @Autowired
    private KfToolsMapper kfToolsMapper;
    @Autowired
    private KfToolsTypeMapper kfToolsTypeMapper;
    
    @Autowired
    private KfToolsTypeService kfToolsTypeService;
    @Autowired
    private IToolsFactoryService toolsFactoryService;
	@Autowired
	private IToolsModelService toolsModelService;
	@Autowired
    private KfToolsBoxService kfToolsBoxService;
	@Autowired
	private KfToolsScrapApplyMapper kfToolsScrapApplyMapper;
	@Autowired
	private KfRToolsScrapMapper kfRToolsScrapMapper;
	@Autowired
	private ISysDictDataService iSysDictDataService;
	
	private static final Logger log = LoggerFactory.getLogger(KfToolsServiceImpl.class);
    /**
     * 根据条件分页查询数据
     * 
     * @param kfTools 信息
     * @return list集合信息
     */
    @Override
    @DataScope(tableAlias = "b6")
    public List<KfTools> selectAllPageList(KfTools kfTools){
    	if(kfTools.getStatusList() != null ){
    		String[] statusList = Convert.toStringArray(kfTools.getStatusList());
    		Map<String, Object> paramsMap = new HashMap<String, Object>();
    		paramsMap.put("statusList",statusList);
    		kfTools.setParams(paramsMap);
    	}
        return kfToolsMapper.selectAllPageList(kfTools);
    }

    /**
     * 根据id查询信息
     * 
     * @param id 
     * @return 对象信息
     */
    @Override
    public KfTools selectKfToolsById(String id){
        return kfToolsMapper.selectKfToolsById(id);
    }

    /**
     * 新增保存信息
     * 
     * @param kfTools RFID信息
     * @return 结果
     */
    @Override
    @Transactional
    public int insertKfTools(KfTools kfTools){
    	
    	for (int i = 0; i < kfTools.getToolNums(); i++) {
    		
    		if(kfTools.getNumberhz()!=null && kfTools.getNumberhz().equals("2")){
    			for (int j = 1; j <= 2; j++) {
    				UUID uuid = UUID.randomUUID();
    				kfTools.setId(uuid.toString());
    				kfTools.setStatus("1");
    				kfTools.setCreateDate(DateUtils.getNowDate()); //创建时间
    				kfTools.setInoutState("1");
    				
    				kfTools.setRfid(generateRfid());
    				
    				KfToolsType kfToolsType=kfToolsTypeMapper.selectByPrimaryKey(kfTools.getToolsTypeId());
    				if(kfToolsType !=null && kfTools.getTestDate() != null){
    					Calendar cal = Calendar.getInstance();
    					cal.setTime(kfTools.getTestDate());//设置起时间
    					cal.add(Calendar.MONTH,(kfToolsType.getTestCycle()));//工具类型的周期 
    					cal.add(Calendar.DATE, -1);
    					kfTools.setNextTestDate(cal.getTime());
    					
    				}
    				
    				
    				StringBuffer usecodes=new StringBuffer();
    				if(kfTools.getElecLevelId()!=null && !kfTools.getElecLevelId().equals("")){
    					
    					String elecLevelId=iSysDictDataService.selectDictLabel("voltage_level", kfTools.getElecLevelId());
    					usecodes.append(elecLevelId+"kV");
    				}
    				usecodes.append(kfTools.getNumberPrefix());
    				usecodes.append(kfTools.getInitNum()+i);
    				
    				usecodes.append("-"+j);
    				kfTools.setUseCode(usecodes.toString());
    				
    				kfToolsMapper.insertSelective(kfTools);
					
				}
    		}else{
    			UUID uuid = UUID.randomUUID();
				kfTools.setId(uuid.toString());
				kfTools.setStatus("1");
				kfTools.setCreateDate(DateUtils.getNowDate()); //创建时间
				kfTools.setInoutState("1");
				
				kfTools.setRfid(generateRfid());
				
				KfToolsType kfToolsType=kfToolsTypeMapper.selectByPrimaryKey(kfTools.getToolsTypeId());
				if(kfToolsType !=null && kfTools.getTestDate() != null){
					Calendar cal = Calendar.getInstance();
					cal.setTime(kfTools.getTestDate());//设置起时间
					cal.add(Calendar.MONTH,(kfToolsType.getTestCycle()));//工具类型的周期 
					cal.add(Calendar.DATE, -1);
					kfTools.setNextTestDate(cal.getTime());
					
				}
				
				
				StringBuffer usecodes=new StringBuffer();
				if(kfTools.getElecLevelId()!=null && !kfTools.getElecLevelId().equals("")){
					
					String elecLevelId=iSysDictDataService.selectDictLabel("voltage_level", kfTools.getElecLevelId());
					usecodes.append(elecLevelId+"kV");
				}
				usecodes.append(kfTools.getNumberPrefix());
				usecodes.append(kfTools.getInitNum()+i);
				
				kfTools.setUseCode(usecodes.toString());
				
				kfToolsMapper.insertSelective(kfTools);
			}
    		
		}
    	return 1;
    }

    /**
     * 
     * @Description 生成rfid
     * @CreateTime 2019年4月10日 上午9:24:59
     * @CreateBy 林龙
     * @return
     */
    private String generateRfid() {
		
    	
    	String rfid=StringUtils.getItemID(12);
    	
    	int ex = kfToolsMapper.findFfid(rfid);//数据量较大，比较耗时
    	while (ex != 0) {
    		rfid=StringUtils.getItemID(12);
    	}
    	
		return rfid;
	}

	/**
     * 修改保存信息
     * 
     * @param kfTools RFID信息
     * @return 结果
     */
    @Override
    @Transactional
    public int updateKfTools(KfTools kfTools){
    	
    	return  kfToolsMapper.updateByPrimaryKeySelective(kfTools);
    }
    
    /**
     * 批量删除
     * 
     * @param ids
     * @throws Exception
     */
    @Override
    public int deleteKfToolsByIds(String ids) throws BusinessException
    {
        String[] kfToolsIds = Convert.toStringArray(ids);
        return kfToolsMapper.deleteKfToolsByIds(kfToolsIds);
    }

    
    /**
	 * 
	 * @Description 批量修改打印状态
	 * @CreateTime 2019年7月5日 上午9:48:03
	 * @CreateBy 林龙
	 * @param ids
	 * @return
	 */
	@Override
	public int printKfToolsByIds(String ids,String num, String loginName) {
		
		 String[] kfToolsIds = Convert.toStringArray(ids);
		 List<String> ids1=new ArrayList<String>();
		 for (String id : kfToolsIds) {
			 ids1.add(id);
		}
		 
		 if(num !=null && num.equals("1")){
			 return kfToolsMapper.printKfToolsByIds(ids1,loginName);
		 }else{
			 return kfToolsMapper.printKfToolsRfidByIds(ids1,loginName);
		 }
		 
	}
    
    /**
     * 
     * @Description 试验申请详情列表
     * @CreateTime 2019年4月4日 上午11:57:25
     * @CreateBy 林龙
     * @param kfTools
     * @return
     */
	@Override
	@DataScope(tableAlias = "u")
	public List<KfTools> selectAllPageTestList(KfTools kfTools) {
		return kfToolsMapper.selectAllPageTestList(kfTools);
	}

	/**
	 * 导入工具数据
	 *
	 * @param toolsList 工具数据列表
	 * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
	 * @param operName 操作用户
	 * @CreateBy wyc
	 * @return 结果
	 */
	@Override
	public String importTools(List<KfTools> toolsList, Boolean isUpdateSupport, String operName)
	{
		if (StringUtils.isNull(toolsList) || toolsList.size() == 0)
		{
			throw new BusinessException("导入工具数据不能为空！");
		}
		int successNum = 0;
		int failureNum = 0;
		StringBuilder successMsg = new StringBuilder();
		StringBuilder failureMsg = new StringBuilder();
		int index= 0;
		for (KfTools tools : toolsList)
		{
			index=index+1;
			try
			{
				// 根据使用编号验证是否存在这个工具
				KfTools t = kfToolsMapper.selectByUseCode(tools.getUseCode());
				if (StringUtils.isNull(t))
				{
					tools.setCreateBy(operName);
					this.insertUpdateImportKfTools(tools,failureMsg,index,operName,"add",failureNum); //库存新增
					successNum++;
					successMsg.append("<br/>" + successNum + "、工具 " + tools.getName() + " 导入成功");
				}
				else if (isUpdateSupport && t != null)
				{
					tools.setId(t.getId());
					this.insertUpdateImportKfTools(tools,failureMsg,index,operName,"update",failureNum); //库存修改
					successNum++;
					successMsg.append("<br/>" + successNum + "、工具 " + tools.getName() + " 更新成功");
				}
				else
				{
					failureNum++;
					failureMsg.append("<br/>" + failureNum + "、库存编号 " + tools.getUseCode() + " 已存在");
				}
			}
			catch (Exception e)
			{
				failureNum++;
//				String msg = "<br/>" + failureNum + "、工具 " + tools.getName() + " 导入失败：";
				failureMsg.append(e.getMessage());
//				log.error(msg, e);
			}
		}
		if (failureNum > 0)
		{
			failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
			throw new BusinessException(failureMsg.toString());
		}
		else
		{
			successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
		}
		return successMsg.toString();
	}


	/**
	 * 
	 * @Description 新增或者编辑库存
	 * @CreateTime 2019年4月28日 下午5:22:05
	 * @CreateBy 林龙
	 * @param tools
	 * @param i 
	 * @param failureNum 
	 * @param string 
	 */
	private void insertUpdateImportKfTools(KfTools tools,StringBuilder failureMsg, int i, String operName,String flag, int failureNum) {
		
		KfToolsType kfToolsType=kfToolsTypeService.selectByName(tools.getName());
		if(kfToolsType == null){
			failureNum++;
			failureMsg.append("<br/>第"+(i+1)+"行，工具名称 ：" + tools.getName() + "不存在！");
		}
		ToolsFactory toolsFactory=toolsFactoryService.selectByFactoryName(tools.getFactoryName());
		if(toolsFactory == null){
			failureNum++;
			failureMsg.append("<br/>第"+(i+1)+"行，工具厂家 ：" + tools.getFactoryName() + "不存在！");
		}
		ToolsModel toolsModel=toolsModelService.selectByModelName(tools.getModelName());
		if(toolsModel == null){
			failureNum++;
			failureMsg.append("<br/>第"+(i+1)+"行，规格型号 ：" + tools.getModelName() + "不存在！");
		}
		KfToolsBox kfToolsBox=kfToolsBoxService.selectByBoxName(tools.getBoxName());
		if(kfToolsBox == null){
			failureNum++;
			failureMsg.append("<br/>第"+(i+1)+"行，工具柜 ：" + tools.getBoxName() + "不存在！");
		}
		
		tools.setToolsTypeId(kfToolsType.getId());
		tools.setFactoryId(toolsFactory.getId());
		tools.setModelId(toolsModel.getId());
		tools.setToolsCabinetId(kfToolsBox.getId());
		
		KfToolsType kfToolsType1=kfToolsTypeMapper.selectByPrimaryKey(tools.getToolsTypeId());
		if(kfToolsType1 !=null  && tools.getTestDate() != null){
			Calendar cal = Calendar.getInstance();
		    cal.setTime(tools.getTestDate());//设置起时间
		    cal.add(Calendar.MONTH,(kfToolsType.getTestCycle()));//工具类型的周期 
		    cal.add(Calendar.DATE, -1);
		    tools.setNextTestDate(cal.getTime());
		}
		
		if(flag.equals("add")){
			UUID uuid = UUID.randomUUID();
			tools.setStatus("1");
			tools.setInoutState("1");
			tools.setRfid(generateRfid());//rfid
			tools.setCreateDate(DateUtils.getNowDate()); //创建时间
			tools.setCreateBy(operName);
			tools.setId(uuid.toString());
			kfToolsMapper.insertSelective(tools);
		}else{
			tools.setUpdateBy(operName);
			tools.setUpdateTime(DateUtils.getNowDate());
			kfToolsMapper.updateByPrimaryKeySelective(tools);
		}
	}

	/**
	 * 
	 * @Description 报废申请详情列表
	 * @CreateTime 2019年4月12日 上午9:18:00
	 * @CreateBy 林龙
	 * @param kfTools
	 * @return
	 */
	@Override
	@DataScope(tableAlias = "u")
	public List<KfTools> selectAllPageScrapList(KfTools kfTools) {
		return kfToolsMapper.selectAllPageScrapList(kfTools);
	}

	/**
	 * 
	 * @Description 根据状态查询库存数量
	 * @CreateTime 2019年4月16日 上午11:04:21
	 * @CreateBy 林龙
	 * @param i
	 * @return
	 */
	@Override
	@DataScope(tableAlias = "b2")
	public int selectByNums(KfTools kfTools) {
		return kfToolsMapper.selectByNums(kfTools);
	}

	/**
	 * 
	 * @Description 查询超期数量
	 * @CreateTime 2019年4月16日 上午11:04:45
	 * @CreateBy 林龙
	 * @return
	 */
	@Override
	@DataScope(tableAlias = "b2")
	public int selectByOverdueNums(KfTools kfTools) {
		return kfToolsMapper.selectByOverdueNums(kfTools);
	}

	/**
	 * 给工具写入RFID
	 *
	 * @param kfTools 工具信息
	 * @CreateBy wyc
	 * @return 结果
	 */
	@Override
	public int writeToolRfid(KfTools kfTools)
	{
		return 1;
	}

	/**
	 * 
	 * @Description 根据rfid查询库存数据
	 * @CreateTime 2019年4月22日 下午1:42:11
	 * @CreateBy 林龙
	 * @param rfid
	 * @return
	 */
	@Override
	public KfTools selectKfTools(String rfid) {
		return kfToolsMapper.selectKfTools(rfid);
	}

	
	@Override
	public List<KfTools> selectWarnningAllPageList(KfTools kfTools) {
		if(kfTools.getStatusList() != null ){
    		String[] statusList = Convert.toStringArray(kfTools.getStatusList());
    		Map<String, Object> paramsMap = new HashMap<String, Object>();
    		paramsMap.put("statusList",statusList);
    		kfTools.setParams(paramsMap);
    	}
        return kfToolsMapper.selectWarnningAllPageList(kfTools);
	}

	/**
	 * 
	 * @Description 前端直接报废
	 * @CreateTime 2019年4月30日 下午4:29:43
	 * @CreateBy 林龙
	 * @param ids
	 * @return
	 */
	@Override
	public int scrappedByPrimary(String ids, SysUser sysUser) throws BusinessException{
		String[] kfToolsIds = Convert.toStringArray(ids);
		
		List<KfTools> list =new ArrayList<KfTools>(); //批量更新
		for (String id : kfToolsIds) {
			
			KfTools kfTools = kfToolsMapper.selectByPrimaryKey(id);
			if(kfTools.getStatus().equals("3") && kfTools.getInoutState().equals("1")){
				 throw new BusinessException("状态为试验中，在库状态为在库的工具不可以报废!");
			}
			if(kfTools.getStatus().equals("2") ){
				throw new BusinessException("库存编号为"+kfTools.getUseCode()+"的工具已报废，不可重复报废!");
			}
			
			list.add(kfTools);
			
			UUID uuid = UUID.randomUUID();
			
			KfToolsScrapApply kfToolsScrapApply =new KfToolsScrapApply();
			kfToolsScrapApply.setId(uuid.toString());
			kfToolsScrapApply.setScrapId("BF_"+DateUtils.getTime());
			kfToolsScrapApply.setApplicant(sysUser.getUserId().toString());
			kfToolsScrapApply.setApplyDate(DateUtils.getNowDate());
			kfToolsScrapApply.setAuditUser("自动审核");
			kfToolsScrapApply.setAuditDate(DateUtils.getNowDate());
			kfToolsScrapApply.setStatus("2");
			kfToolsScrapApply.setReasonId(3);
			kfToolsScrapApply.setCreateBy(sysUser.getLoginName());
			kfToolsScrapApply.setCreateTime(DateUtils.getNowDate());
			kfToolsScrapApplyMapper.insertSelective(kfToolsScrapApply); //新增申请单
			
			
			KfRToolsScrap kfRToolsScrap=new  KfRToolsScrap();
    		kfRToolsScrap.setScrapId(uuid.toString());
    		kfRToolsScrap.setToolsId(kfTools.getId());
    		kfRToolsScrap.setStatus("1");
			kfRToolsScrapMapper.insertSelective(kfRToolsScrap);
		}
		
		
		return kfToolsMapper.scrappedByPrimary(list);
	}

	 /**
     * 
     * @Description 首页报表饼图
     * @CreateTime 2019年5月13日 下午2:36:33
     * @CreateBy 林龙
     * @param kfToolsInoutRecords
     * @return
     */
	@Override
	@DataScope(tableAlias = "b4")
	public List<Map<String, Object>> getChartData(KfTools kfTools) {
		List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>();	
		List<KfTools> list1 = kfToolsMapper.selectAllChartData(kfTools);
		
		for (KfTools kfTools1 : list1) {
			Map<String,Object> resultMap = new HashMap<String,Object>();// 返回值
				resultMap.put("name", kfTools1.getName());
				resultMap.put("value", kfTools1.getToolsNums());
				resultMap.put("outnums", kfTools1.getOutnums());
				resultMap.put("innums", kfTools1.getInnums());
				resultList.add(resultMap);
		}
		
		return resultList;
	}

	

	
	/**
	 * 
	 * @Description 手机端查询
	 * @CreateTime 2019年7月9日 上午9:05:21
	 * @CreateBy 林龙
	 * @param id
	 * @return
	 */
	@Override
	public Object selectKfToolsPhoneById(String id) {
		return kfToolsMapper.selectKfToolsPhoneById(id);
	}

	@Override
	public List<KfTools> selectAllPageListByIds(String ids) {
		
		String[] kfToolsIds = Convert.toStringArray(ids);
        return kfToolsMapper.selectAllPageListByIds(kfToolsIds);
	}

	@Override
	public void updateKfToolsIds(KfTools kfTools) {
		for (String id : kfTools.getIds()) {
			KfTools kfToolsNew=kfToolsMapper.selectByPrimaryKey(id);
			
			kfToolsNew.setId(id);
			kfToolsNew.setTestDate(kfTools.getTestDate());
			
			KfToolsType kfToolsType=kfToolsTypeMapper.selectByPrimaryKey(kfToolsNew.getToolsTypeId());
			Calendar cal = Calendar.getInstance();
			cal.setTime(kfTools.getTestDate());//设置起时间
			cal.add(Calendar.MONTH,(kfToolsType.getTestCycle()));//工具类型的周期 
			cal.add(Calendar.DATE, -1);
			kfToolsNew.setNextTestDate(cal.getTime());
				
			
			kfToolsMapper.updateByPrimaryKeySelective(kfToolsNew);
		}
		
	}

	@Override
	@DataScope(tableAlias = "b2")
	public List<KfTools> selectNotReturnedNums(KfTools kfTools) {
		
		return kfToolsMapper.selectNotReturnedNums(kfTools);
	}

	@Override
	@DataScope(tableAlias = "b6")
	public List<KfTools> selectAllPageJcList(KfTools kfTools) {
		return kfToolsMapper.selectAllPageJcList(kfTools);
	}

}
